/**
 * 版权所有 2009-2012山东新北洋信息技术股份有限公司
 * 保留所有权利。
 */
package com.linyaonan.leetcode.easy._20;

import java.util.LinkedList;

/**
 * 给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串，判断字符串是否有效。
 * <p>
 * 有效字符串需满足：
 * <p>
 * 左括号必须用相同类型的右括号闭合。
 * 左括号必须以正确的顺序闭合。
 * 注意空字符串可被认为是有效字符串。
 * <p>
 * 输入: "()"
 * 输出: true
 * <p>
 * 输入: "()[]{}"
 * 输出: true
 * <p>
 * 输入: "([)]"
 * 输出: false
 * <p>
 * 输入: "{[]}"
 * 输出: true
 *
 * @ProjectName: leetcode
 * @Package: com.linyaonan.leetcode.easy._20
 * @ClassName: IsValidPath
 * @Author: linyaonan
 * @Date: 2019/10/7 17:41
 */
public class IsValidPath {

    public static final Character YUAN_L = '(';
    public static final Character YUAN_R = ')';
    public static final Character FANG_L = '[';
    public static final Character FANG_R = ']';
    public static final Character HUA_L = '{';
    public static final Character HUA_R = '}';

    public boolean isValid(String s) {
        if (s == null) {
            return false;
        }
        if ("".equals(s)) {
            return true;
        }
        if (s.length() % 2 != 0) {
            return false;
        }
        if (s.startsWith(String.valueOf(YUAN_R)) || s.startsWith(String.valueOf(FANG_R)) || s.startsWith(String.valueOf(HUA_R))) {
            return false;
        }
        return checkValid(s);
    }

    private boolean checkValid(String str) {
        LinkedList<Character> stack = new LinkedList<>();
        char[] chars = str.toCharArray();
        for (char c : chars) {
            if (YUAN_L.equals(c) || FANG_L.equals(c) || HUA_L.equals(c)) {
                stack.push(c);
            } else {
                Character pop = stack.isEmpty() ? 'Q' : stack.pop();
                if (!pop.equals(getOther(c))) {
                    return false;
                }
            }
        }
        return stack.isEmpty();
    }

    private Character getOther(Character c) {
        if (c.equals(YUAN_R)) {
            return YUAN_L;
        } else if (c.equals(FANG_R)) {
            return FANG_L;
        } else {
            return HUA_L;
        }
    }

    public boolean isValid2(String s) {
        // 1. 奇数字符串直接返回false
        if (s.length() % 2 != 0) {
            return false;
        }
        // 2. 特殊情况
        char startC = s.charAt(0);
        char endC = s.charAt(s.length() - 1);
        if (startC == '}' || startC == ']' || startC == ')') {
            return false;
        }
        if (endC == '{' || endC == '[' || endC == '(') {
            return false;
        }
        LinkedList<Character> list = new LinkedList<>();
        for (char c : s.toCharArray()) {
            if (c == '{' || c == '[' || c == '(') {
                list.addLast(c);
            } else {
                switch (c) {
                    case '}':
                        if (!list.isEmpty() && list.peekLast() == '{') {
                            list.removeLast();
                        } else {
                            list.addLast(c);
                        }
                        break;
                    case ']':
                        if (!list.isEmpty() && list.peekLast() == '[') {
                            list.removeLast();
                        } else {
                            list.addLast(c);
                        }
                        break;
                    case ')':
                        if (!list.isEmpty() && list.peekLast() == '(') {
                            list.removeLast();
                        } else {
                            list.addLast(c);
                        }
                        break;
                }
            }

        }
        return list.isEmpty();
    }

}
